package com.xian.im.modules.im.service.impl;

import com.xian.im.common.constant.EhcacheConstant;
import com.xian.im.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.xian.im.modules.im.dao.GroupDao;
import com.xian.im.modules.im.entity.GroupEntity;
import com.xian.im.modules.im.service.GroupService;
import org.springframework.transaction.annotation.Transactional;

@Slf4j
@Service("groupService")
public class GroupServiceImpl extends ServiceImpl<GroupDao, GroupEntity> implements GroupService {

    /**
     * @param uniqueId
     * @return
     */
    @Override
    @CacheEvict(value = EhcacheConstant.GROUP)
    public Boolean delEntityByUniqueId(String uniqueId) {
        return this.lambdaUpdate().eq(GroupEntity::getGroupUniqueId,uniqueId).remove();
    }

    /**
     * @param uniqueId
     * @param orgId
     * @return
     */
    @Override
    public Boolean delEntityByUniqueId(String uniqueId, Long orgId) {
        return this.lambdaUpdate().eq(GroupEntity::getGroupUniqueId,uniqueId).eq(GroupEntity::getOrgId,orgId).remove();
    }

    /**
     * @param entity
     * @return
     */
    @Override
    @Cacheable(value = EhcacheConstant.GROUP)
    public Boolean updateByUniqueId(GroupEntity entity) {
        return this.lambdaUpdate().eq(GroupEntity::getGroupUniqueId,entity.getGroupUniqueId()).update(entity);
    }

    /**
     * @param uniqueId
     * @return
     */
    @Override
    @Cacheable(value = EhcacheConstant.GROUP)
    public GroupEntity getEntityByUniqueId(String uniqueId) {
        return this.lambdaQuery().eq(GroupEntity::getGroupUniqueId,uniqueId).one();
    }

    /**
     * @param uniqueId
     * @param orgId
     * @return
     */
    @Override
    public GroupEntity getEntityByUniqueId(String uniqueId, Long orgId) {
        return this.lambdaQuery().eq(GroupEntity::getGroupUniqueId,uniqueId).eq(GroupEntity::getOrgId,orgId).one();
    }

    /**
     * 是否禁言
     *
     * @param uniqueId
     * @return  true 正常 false 是禁言
     */
    @Override
    @Transactional(readOnly = true)
    public Boolean isMute(String uniqueId) {
        GroupEntity entity = this.lambdaQuery().eq(GroupEntity::getGroupUniqueId, uniqueId).select(GroupEntity::getShutUp).one();;
        if (entity != null) {
            return 0 == (entity.getShutUp()) ? Boolean.TRUE : Boolean.FALSE;
        }
        throw new BusinessException("当前群组不存在");

    }

    /**
     * 是否禁言
     *
     * @param uniqueId
     * @param orgId
     * @return
     */
    @Override
    public Boolean isMute(String uniqueId, Long orgId) {
        GroupEntity entity = this.lambdaQuery().eq(GroupEntity::getGroupUniqueId, uniqueId).eq(GroupEntity::getOrgId,orgId).select(GroupEntity::getShutUp).one();;
        if (entity != null) {
            return 0 == (entity.getShutUp()) ? Boolean.TRUE : Boolean.FALSE;
        }
        throw new BusinessException("当前群组不存在");
    }
}